package com.example.compose

import androidx.compose.material.Text
import androidx.compose.ui.test.*
import androidx.compose.ui.test.junit4.createComposeRule
import org.junit.Rule
import org.junit.Test

//https://developer.android.google.cn/codelabs/jetpack-compose-testing?hl=zh-cn&continue=https%3A%2F%2Fdeveloper.android.google.cn%2Fcourses%2Fpathways%2Fcompose%3Fhl%3Dzh-cn%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fjetpack-compose-testing#4
class TopAppBarTest {
    //Compose 提供一个 ComposeTestRule，调用 createComposeRule() 即可获得此规则。您可以通过此规则设置被测 Compose 内容并与其交互。
    @get:Rule
    val composeTestRule = createComposeRule()

    //Compose 提供一个 ComposeTestRule，调用 createComposeRule() 即可获得此规则。您可以通过此规则设置被测 Compose 内容并与其交互。
    //@get:Rule
    //val composeTestRule = createAndroidComposeRule(RallyActivity::class.java)

    //不过，在 Compose 中，我们可以通过对组件进行隔离测试来大幅简化测试工作。
    // 您可以选择要在测试中使用的 Compose 界面内容。
    // 这可通过 ComposeTestRule 的 setContent 方法完成，并且您可以在任何位置调用它（但只能调用一次）。
    @Test
    fun myTest() {
        composeTestRule.setContent {
            Text("You can set any Compose content!")
        }
    }

    @Test
    fun rallyTopAppBarTest() {
        composeTestRule.setContent {
        }
        //您可以对节点使用 printToLog 函数来输出语义树。将一行新代码添加到测试中：
//        composeTestRule.onRoot().printToLog("currentLabelExists")
        //        Test1
//        composeTestRule
//            .onNodeWithContentDescription(RallyScreen.Accounts.name)
//            .assertExists()
        //        Test2
//        composeTestRule
//            .onNodeWithText(RallyScreen.Accounts.name.toUpperCase())
//            .assertExists()
        //        Test3
//        composeTestRule
//            .onNode(
//                hasText(RallyScreen.Accounts.name.toUpperCase()) and
//                        hasParent(
//                            hasContentDescription(RallyScreen.Accounts.name)
//                        ),
//                useUnmergedTree = true
//            ).assertExists()
        //严格来说，在这种情况下不必将父节点添加到匹配器中，因为这是一项严格隔离的测试。
        // 不过，最好避免只使用条件宽泛的查找器（例如 hasText），否则可能会在大型测试中失败（可能会找到该文本的其他实例）。
    }
    /**
     * Compose 会在某些可组合项（例如 Text）中自动公开这些语义属性。您也可以自定义和合并这些属性，用来表示由一个或多个后代组成的单个组件。
     * 例如，您可以表示一个包含 Text 可组合项的 Button。属性 MergeDescendants = 'true' 表示，此节点有后代，但已合并到此节点中。在
     * 测试中，我们常常需要访问所有节点。
     * 为了验证标签页中的 Text 是否会显示，我们可以将 useUnmergedTree = true 传递给 onRoot 查找器，查询未合并的语义树。
     * composeTestRule.onRoot(useUnmergedTree = true).printToLog("currentLabelExists")
     * */

    /**
     * 您编写的任何测试都必须与被测对象正确同步。
     * 例如，当您使用 onNodeWithText 等查找器时，测试会一直等到应用进入空闲状态后才查询语义树。
     * 如果不同步，测试就可能会在元素显示之前查找元素，或者不必要地等待。
     * */
    @Test
    fun overviewScreen_alertsDisplayed() {
        composeTestRule.setContent {
//            OverviewBody()
        }

        composeTestRule
            .onNodeWithText("Alerts")
            .assertIsDisplayed()
    }

}